package com.upcode.weighing.util;

/**
 * <p>
 *    生成类似 001001005 有结构性的编码
 * </p>
 *
 * @author wangxu
 * @since 2019-09-13
 */
public class GenerateNodeCode {

    /**
     *@Description ：根据当前出入编码生成下级编码。
     *@Params：  nowCode 当前编码：如果当前编码是001005 生成的是001006
     *@Params： nodeLength 编码长度，值得是每一节编码长度，长度不足使用“0”补齐，
     *          如编码001005长度是6位它是两节 nodeLength是3：001  006
     *@Return： 生成后的下一个编码
     *@Author：wangxu
     *@时间：2019/9/3
     */
    public static String creatNextCode(String nowCode, int nodeLength) {
        if (nowCode == null) {
            //没有上一节编码默认就生成第一节编码。
            return nextCode("0", nodeLength);
        } else if (nowCode.length() == nodeLength) {
            //编码长度和 每一节长度相同说明只有一节
            return nextCode(nowCode, nodeLength);
        } else {
            //多级编码截取父级编码
            String parentCode = nowCode.substring(0, nowCode.length() - nodeLength);
            //多级编码截取最后一节编码
            String lastCode = nowCode.substring(nowCode.length() - nodeLength);
            //根据最后一节编码生成下一个编码
            String nextCode = parentCode + nextCode(lastCode, nodeLength);
            return nextCode;
        }
    }

    /**
     * @Description ：根据当前出入编码生成下级编码。
     * @Params： code 当前编码：如果当前编码是005 生成的是006
     * @Params： nodeLength 编码长度，长度不足使用“0”补齐，如编码长度nodeLength是3：006
     * @Return： 生成后的下一个编码
     * @Author：wangxu
     * @时间：2019/9/3
     */
    private static String nextCode(String code, int nodeLength) {
        //将当前编码转换为 int
        int nowNum = Integer.parseInt(code);
        //获取下一个序列
        int nextNum = nowNum + 1;
        //将生成序列转换String
        String nextCode = String.valueOf(nextNum);
        //判断序列是否需要补齐位数
        if (nextCode.length() < nodeLength) {
            //计算需要补齐的位数
            int forCodeLength = nodeLength - nextCode.length();
            for (int i = 0; i < forCodeLength; i++) {
                nextCode = "0" + nextCode;
            }
        }
        return nextCode;
    }
}
